package com.ctshk.rpc.order.bus.service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

import com.ctshk.common.dto.Result;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.common.req.OperationByIdReq;
import com.ctshk.common.req.OperationPageByIdReq;
import com.ctshk.common.vo.OrderRefundDTO;
import com.ctshk.rpc.order.bus.dto.*;
import com.ctshk.rpc.order.bus.req.BusBusOrderConfirmReq;
import com.ctshk.rpc.order.bus.req.BusCancelOrderReq;
import com.ctshk.rpc.order.bus.req.BusOrderCancelB2CReq;
import com.ctshk.rpc.order.bus.req.BusOrderCreateB2CReq;
import com.ctshk.rpc.order.bus.req.BusOrderOrderInformTouristReq;
import com.ctshk.rpc.order.bus.req.BusOrderPageReq;
import com.ctshk.rpc.order.bus.req.BusOrderPayB2CReq;
import com.ctshk.rpc.order.bus.req.BusOrderPaymentReq;
import com.ctshk.rpc.order.bus.req.BusOrderSupplieConfirmReq;
import com.ctshk.rpc.order.bus.req.BusOrderTouristReq;
import com.ctshk.rpc.order.bus.req.BusPayOrderCollectionReq;
import com.ctshk.rpc.order.bus.req.BusPlaceOrderReq;
import com.ctshk.rpc.order.bus.req.BusRefreshByConfirmOrderReq;

/**
 * <p>
 * 巴士订单表 服务类
 * </p>
 *
 * @author 彭柳霖
 * @since 2021-02-24
 */
public interface IBusOrderService {

    /**
     * 填写订单信息
     * @param busPlaceOrderReq
     * @param user
     * @return
     */
    Result<Long> addBusOrder(BusPlaceOrderReq busPlaceOrderReq, Long userId);
    
    /**
     * B2C填写订单信息
     * @return
     */
    Result<Long> addBusOrderB2C(BusOrderCreateB2CReq req, Long userId);


    /**
     * 预订中心下单
     *
     * @param reqList 预订中心订单入参
     * @return 返回值
     */
    Result payOrder(Long id,List<BusPayOrderCollectionReq> reqList,TokenUser user);
    
    /**
     * 支付
     * @param req
     * @param tokenUser
     * @return
     */
    Result<Long> payment(BusOrderPaymentReq req, TokenUser tokenUser);
    
    /**
     * B2C支付订单
     * @param req
     * @return
     */
    Result<Long> payOrderB2C(BusOrderPayB2CReq req, Long userId);



    /**
     * 取消订单
     * @param cancelOrderReq
     * @param user
     */
    Result cancelOrder(BusCancelOrderReq cancelOrderReq,TokenUser user);
    
    /**
     * B2C取消订单
     * @param req
     * @return
     */
    Result<Void> cancelOrderB2C(BusOrderCancelB2CReq req, Long userId);



    /**
     * 巴士线路列表
     * @param busOrderPageReq
     * @return
     */
    PageResponse<BusOrderPageDTO> queyList(BusOrderPageReq busOrderPageReq, TokenUser tokenUser);


    /**
     * 根据订单id查询订单详细信息
     *
     * @param orderId 订单id
     * @return 订单消息
     */
    Result<BusOrderDetailDTO> queryOrderDetailInfo(Long orderId);


    /**
     * 修改旅客信息
     */
    Result updateBusOrderTourist(BusOrderTouristReq touristReq,Long userId);



    /**
     * 确认退款
     *
     * @param id
     * @param refundId
     * @param userId
     * @return
     */
    Result confirmRefund(Long id, Long refundId, Long userId);


    /**
     * 支付页面查询信息
     * @param id
     * @return
     */
    Result<BusOrderPayInfoDTO> paymentInfoById(Long id);

    /**
     * 查询订单的旅客信息列表
     * @param req
     * @return
     */
    Result<PageResponse<BusOrderTouristDTO>> queryTouristListByOrder(OperationPageByIdReq req);
    
    /**
     * 查询订单的收款明细信息列表
     * @param req
     * @return
     */
    Result<PageResponse<BusOrderCollectionDTO>> queryCollectionListByOrder(OperationPageByIdReq req);
    
    /**
     * 查询订单的退款记录信息列表
     * @param req
     * @return
     */
    Result<PageResponse<BusOrderRefundDTO>> queryRefundListByOrder(OperationPageByIdReq req);
    
    /**
     * 确认巴士订单
     * @param req
     * @return
     */
    Result<Void> confirmBusOrder(BusBusOrderConfirmReq req, TokenUser tokenUser);
    
    /**
     * 查询订单的可退金额
     * @param req
     * @return
     */
    Result<BigDecimal> findCanRefundAmountByOrder(OperationByIdReq req);
    
    /**
     * 确认订单后的相关巴士处理
     * @param req
     * @return
     */
    Result<Void> refreshByConfirmOrder(BusRefreshByConfirmOrderReq req, TokenUser tokenUser);

    /**
     * 查询巴士产品最近7天销量
     * @param id
     * @return
     */
    Integer findBusProduct7DaySaleCount(Long id);
    
    /**
     * 获取退款记录(财务-内部接口)
     *
     * @param orderNumber 订单编号
     * @return
     */
    List<OrderRefundDTO> getRefundList(String orderNumber);
    
    /**
     * 巴士订单通知旅客
     * @param req
     * @return
     */
    Result<Void> informTourist(BusOrderOrderInformTouristReq req);
    
    /**
     * 供应商确认巴士订单
     * @return
     */
    Result<Void> supplieConfirmOrder(BusOrderSupplieConfirmReq req, Long userId);
    
    /**
     * 生成巴士销售编号
     * @param userId
     * @param nowLocalDateTime
     * @return
     */
    String buildOrderNumber(Long userId, LocalDateTime nowLocalDateTime);
    
    /**
     * 生成收款单号:
     * SKD+年後2位+月日4位+時分秒6位+2位隨機數字
     */
    String generatorPaymentNumber(LocalDateTime nowLocalDateTime);
    
    /**
     * 查询订单保险信息
     * @param orderId
     * @return
     */
    Result<BusOrderInsuranceDTO> findInsuranceByOrder(Long orderId);


    /**
     * 最近一次查询结束时间到当前时间的数据
     */
    Result<List<MyBusOrderDTO>> recentToNow(LocalDateTime recent, LocalDateTime now);

    /**
     * 最近一次查询结束时间到当前时间的订单DTO
     */
    List<BusOrderDTO> queryOrderDTOList(LocalDateTime start, LocalDateTime end);
}
